package com.annotation.configure;

import com.annotation.bean.Bike;
import com.annotation.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;


/**
 * bean的生命周期创建过程    ：
 * bean的创建------------初始化----------------销毁的过程
 * Spring的bean的生命周期由IOC容器来管理，但是我们可以自定义bean的初始化和销毁方法；容器在bean进行到当前的生命周期的时候可以来调用我们自定义的初始化方法和销毁方法
 * <p>
 *  指定Bean的自定义初始化和销毁方法
 *
 *   初始化：  对象创建完成，并赋值，调用此方法
 *   销毁：   对象被移除BeanDefination或者IOC容器被销毁时。
 *
 *   指定Bean初始化和销毁的方法：
 *
 * 1. @Bean的init-method  和  destory-method 方法  注意：当@Scope注解是 prototype的时候，初始化和销毁方法不启用，所以使用该方法必须是单实例的时候。
 *
 * 2. 通过Bean实现InitializingBean接口和DisposableBean接口  里面的方法：
 *              afterPropertiesSet() 和destory()方法 在Bean初始化之前和销毁之后进行调用。
 *
 * 3.可以使用JSR250规范里面定义的两个注解
 *              @PostConstruct :bean创建并且完成属性赋值后，来执行初始化方法
 *              @PreDestory : bean被移除之前回调该方法
 *
 * 4.BeanPostProcessor【interface】  :bean的后置处理器 ，里面有方法
 *                  postProcessBeforeInitialization(Object bean, String beanName) :初始化之前工作
 *                  postProcessAfterInitialization(Object bean, String beanName) : Bean的后置处理器初始化之后调用
 *
 *   Spring 底层对BeanPostProcessor的使用：
 *         bean负值 ，注入其他组件，@Autowired,生命周期注解功能，@Async, xxxBeanPostProcesser  都是Spring底层使用BeanPostProcesser原理完成的
 *
 *
 *
 */
@Configuration
@ComponentScan("com.annotation.bean")
public class TestConfigOfLifeCycle {

    //@Scope("prototype")  加上多实例注解后   初始化方法和销毁方法不起作用
    @Bean(value = "car",initMethod = "init",destroyMethod = "destory")
    public Car getCar() {
        Car car = new Car();
        return car;
    }

    /**
     *    测 试 InitializingBean, DisposableBean 接口的作用
     */
    @Bean("bike")
    @Scope("prototype")
    public Bike  getBike(){
        return  new Bike();
    }
}
